#ifndef __MEMORY_CHUNK__
#define __MEMORY_CHUNK__

#include<iostream>
#include<memory>

#include<assert.h>
#include<memory.h>

#include"../log/log.hpp"

//内存块，内存池分配单位
struct Chunk
{
    explicit Chunk(int size)
        :_capacity(size),_data(new char[size])
    {
        assert(_data);
    }

    //清空内存块
    void clear(){_length=_head=0;}

    //调整内存块内部数据位置
    void adjust()
    {
        if(_head)
        {
            if(_length)memmove(_data,_data+_head,_length);
            _head=0;
        }
    }

    //拷贝另一内存块内容
    void copy(const std::shared_ptr<Chunk> other)
    {
        memcpy(_data,other->_data+other->_head,other->_length);
        _head=0;
        _length=other->_length;
    }

    //从前减掉内存块内容
    void pop(int len)
    {
        _length-=len;
        _head+=len;
    }

    //测试接口
    // [[deprecated("chunk debug api deprecated!")]]
    void test()
    {
        for(int i=_head;i<_length;i++)
        {
            printf("%c", _data[i]);
        }
        printf("\n");
    }

    ~Chunk()
    {
        if(_data)
        {
            delete [] _data;
        }
    }

    int _capacity{0};           //内存块容量
    int _length{0};             //内存块内容长度
    int _head{0};               //内存块头          

    char* _data{nullptr};       //内存块数据
    std::shared_ptr<Chunk> _next{nullptr};      //下一个内存块
};

#endif